home *** CD-ROM | disk | FTP | other *** search
/ Java Programmer's Toolkit / Java Programmer's Toolkit.iso / gs3.53 / gs_dps1.ps < prev    next >
Text File  |  1996-01-10  |  8KB  |  278 lines

  1. %    Copyright (C) 1990, 1991, 1993, 1994 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % Initialization file for analogs of Display PostScript functions
  16. % that are also included in Level 2.
  17. % When this is run, systemdict is still writable,
  18. % but (almost) everything defined here goes into level2dict.
  19.  
  20. level2dict begin
  21.  
  22. % ------ Virtual memory ------ %
  23.  
  24. /currentshared /.currentglobal load def
  25. /scheck /.gcheck load def
  26. %****** FOLLOWING IS WRONG ******
  27. /shareddict currentdict /globaldict .knownget not { 20 dict } if def
  28.  
  29. % Global and LocalFontDirectory must remain in systemdict
  30. % even if we temporarily exit Level 2 mode.
  31.  
  32. end                % level2dict
  33. systemdict begin
  34.  
  35. /SharedFontDirectory FontDirectory .gcheck
  36.  { .currentglobal false .setglobal
  37.    /LocalFontDirectory FontDirectory dup maxlength dict copy def
  38.    .setglobal FontDirectory
  39.  }
  40.  { /LocalFontDirectory FontDirectory def
  41.    50 dict
  42.  }
  43. ifelse def
  44.  
  45. end                % systemdict
  46. level2dict begin
  47.  
  48. % setshared must rebind FontDirectory to the appropriate one of
  49. % Local or SharedFontDirectory.
  50.  
  51. /.setglobal
  52.  { .setglobal
  53.    //systemdict /FontDirectory .currentglobal
  54.     { //SharedFontDirectory }
  55.     { //systemdict /LocalFontDirectory get }    % can't embed ref to local VM
  56.    ifelse .forceput
  57.  } .bind odef        % must bind .forceput and .setglobal
  58.             % even if NOBIND in effect
  59. /setshared /.setglobal load def
  60. .currentglobal setshared
  61.  
  62. % ------ Fonts ------ %
  63.  
  64. /selectfont
  65.  { exch findfont exch
  66.    dup type /arraytype eq { makefont } { scalefont } ifelse
  67.    setfont
  68.  } odef
  69. % Undefinefont has to take local/global VM into account.
  70. /undefinefont
  71.  { FontDirectory 1 index undef
  72.    .currentglobal
  73.     {        % Current mode is global; delete from local directory too.
  74.       systemdict /LocalFontDirectory .knownget
  75.        { exch undef }
  76.        { pop }
  77.       ifelse
  78.     }
  79.     {        % Current mode is local; if there was a shadowed global
  80.         % definition, copy it into the local directory.
  81.       systemdict /SharedFontDirectory .knownget
  82.        { 1 index .knownget
  83.       { FontDirectory 3 1 roll put }
  84.       { pop }
  85.      ifelse
  86.        }
  87.       if
  88.     }
  89.    ifelse
  90.  } odef
  91.  
  92. % If we load a font into global VM within an inner save, the restore
  93. % will delete it from FontDirectory but not from SharedFontDirectory.
  94. % We have to handle this by making restore copy missing entries from
  95. % SharedFontDirectory to FontDirectory.  Since this could slow down restore
  96. % considerably, we define a new operator .dictcopynew for this purpose.
  97. % Furthermore, if FAKEFONTS is in effect, we want global real fonts to
  98. % override fake local ones.  We handle this by brute force.
  99. /restore
  100.  { //restore
  101.    //systemdict /LocalFontDirectory get
  102.    FAKEFONTS
  103.     { mark 1 index dup { length 1 gt { pop } { 2 copy pop } ifelse } forall
  104.       pop counttomark 2 idiv { undef } repeat pop
  105.     }
  106.    if
  107.    //SharedFontDirectory exch .dictcopynew pop
  108.  } bind odef
  109.  
  110. % ------ Halftones ------ %
  111.  
  112. /.makestackdict
  113.     { { counttomark -1 roll } forall .dicttomark
  114.     } bind def
  115. /currenthalftone
  116.     { mark .currenthalftone
  117.        { { exch pop }        % halftone
  118.          { /HalftoneType 1        % screen
  119.         { /Frequency /Angle /SpotFunction }
  120.            .makestackdict
  121.          }
  122.          { /HalftoneType 2        % colorscreen
  123.         { /RedFrequency /RedAngle /RedSpotFunction
  124.           /GreenFrequency /GreenAngle /GreenSpotFunction
  125.           /BlueFrequency /BlueAngle /BlueSpotFunction
  126.           /GrayFrequency /GrayAngle /GraySpotFunction
  127.         }
  128.            .makestackdict
  129.          }
  130.        }
  131.       exch get exec
  132.     } odef
  133. % Define sethalftone so it converts all other types to type 5.
  134. /.sethalftoneRGBV    % <dict> <type> <keys> <keysRGBV>
  135.     { 4 -1 roll exch { 1 index exch get exch } forall 15 1 roll
  136.       14 -2 roll mark 15 1 roll { /Gray /Blue /Green /Red }
  137.        {        % stack: v0 v1 v2 type keys comp
  138.          mark
  139.          2 index 0 get 8 -1 roll
  140.          4 index 1 get 9 -1 roll
  141.          6 index 2 get 10 -1 roll
  142.             % stack: type keys comp mark k0 v0 k1 v1 k2 v2
  143.          /HalftoneType 10 index .dicttomark
  144.          counttomark 2 roll
  145.        }
  146.       forall pop pop
  147.       /Default 1 index .dicttomark .sethalftone5
  148.     } bind def
  149. /sethalftone
  150.     { dup /HalftoneType get 1 sub
  151.        {  { mark /Default 2 index .dicttomark .sethalftone5 }
  152.           { 1 { /Frequency /Angle /SpotFunction }
  153.         { /RedFrequency /RedAngle /RedSpotFunction
  154.           /GreenFrequency /GreenAngle /GreenSpotFunction
  155.           /BlueFrequency /BlueAngle /BlueSpotFunction
  156.           /GrayFrequency /GrayAngle /GraySpotFunction
  157.         } .sethalftoneRGBV
  158.           }
  159.           { mark /Default 2 index .dicttomark .sethalftone5 }
  160.           { 3 { /Width /Height /Thresholds }
  161.         { /RedWidth /RedHeight /RedThresholds
  162.           /GreenWidth /GreenHeight /GreenThresholds
  163.           /BlueWidth /BlueHeight /BlueThresholds
  164.           /GrayWidth /GrayHeight /GrayThresholds
  165.         } .sethalftoneRGBV
  166.           }
  167.           { dup .sethalftone5 }
  168.        } exch get exec
  169.     } odef
  170. % Redefine setscreen and setcolorscreen to recognize halftone dictionaries,
  171. % and to insert the Frequency and Angle into Type 1 halftones, per
  172. % Adobe TN 5085.
  173. /.fixsethalftonescreen
  174.  { dup /HalftoneType get 1 eq
  175.     { dup wcheck not { dup length dict copy } if
  176.       dup /Frequency 4 index put
  177.       dup /Angle 3 index put
  178.     }
  179.    if
  180.  } bind def
  181. /setscreen
  182.     { dup type /dicttype eq
  183.        { .fixsethalftonescreen sethalftone pop pop }
  184.        { //setscreen }
  185.       ifelse
  186.     } odef
  187. /setcolorscreen
  188.     { dup type /dicttype eq
  189.        { .fixsethalftonescreen sethalftone 11 { pop } repeat }
  190.        { //setcolorscreen }
  191.       ifelse
  192.     } odef
  193. % Redefine currentscreen and currentcolorscreen to extract the Frequency
  194. % and Angle from Type 1 halftones, per Adobe TN 5085.
  195. /.fixcurrenthalftonescreen    % <dict> .fix... <freq> <angle> <proc>
  196.  { dup /HalftoneType get 1 eq
  197.     { dup /Frequency get 1 index /Angle get }
  198.     { 60 0 }
  199.    ifelse 3 2 roll
  200.  } bind def
  201. /currentscreen
  202.     { .currenthalftone
  203.        { { .fixcurrenthalftonescreen }    % halftone
  204.          { }                % screen
  205.          { 12 3 roll 9 { pop } repeat    % colorscreen
  206.            dup type /dicttype eq { .fixcurrenthalftonescreen } if
  207.          }
  208.        }
  209.       exch get exec
  210.     } odef
  211. /currentcolorscreen
  212.     { .currenthalftone
  213.        { { .fixcurrenthalftonescreen 3 copy 6 copy }    % halftone
  214.          { 3 copy 6 copy }            % screen
  215.          { }                % colorscreen
  216.        }
  217.       exch get exec
  218.     } odef
  219.  
  220. % ------ User objects ------ %
  221.  
  222. /.localarray where
  223.  { pop }
  224.  { /.localarray
  225.     { currentglobal false setglobal
  226.       exch array exch setglobal
  227.     } bind def
  228.  }
  229. ifelse
  230. /defineuserobject
  231.     { userdict /.UserObjects known
  232.        { 1 index userdict /.UserObjects get length ge
  233.           { 1 index 1 add .localarray userdict /.UserObjects get
  234.         1 index copy pop
  235.         userdict /.UserObjects 3 -1 roll put
  236.           }
  237.          if
  238.        }
  239.        { userdict /.UserObjects 3 index 1 add .localarray put
  240.        }
  241.       ifelse
  242.       userdict /.UserObjects get 3 1 roll put
  243.     } odef
  244. /execuserobject
  245.     { userdict /.UserObjects get exch get exec
  246.     } odef
  247. /undefineuserobject
  248.     { userdict /.UserObjects get exch null put
  249.     } odef
  250.  
  251. % ------ User paths ------ %
  252.  
  253. % We define upath carefully so it won't leave garbage on the stack
  254. % if an error occurs.
  255. /upath
  256.     { [
  257.        { 1 index {/ucache cvx} if true .pathbbox /setbbox cvx
  258.          {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx}
  259.          pathforall ]
  260.        }
  261.       stopped
  262.        { cleartomark /upath load $error /errorname get signalerror
  263.        }
  264.       if cvx exch pop
  265.     } odef
  266.  
  267. % Dummy definitions for cache control operators
  268.  
  269. /ucachestatus
  270.     { mark 0 0 0 0 0 } odef
  271. /setucacheparams
  272.     { cleartomark } odef
  273.  
  274. end                % level2dict
  275.